package controlador;
import vista.*;
import modelo.*;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

import javax.swing.JComboBox;
import javax.swing.JFrame.*;
import modelo.Conexion;

public class ControlFacturaV implements ActionListener{

	private FacturaV formfact;
	
	public ControlFacturaV()
	{
		super();
		this.formfact = new FacturaV();
		this.formfact.addListener(this);
		this.formfact.setVisible(true);
		formfact.setLocationRelativeTo(null);
		new KeyL();
		Ini();
	}
	
	public class KeyL implements KeyListener
	{
		public KeyL()
		{
			formfact.addKeyListener(this);
		}
		public void keyPressed(KeyEvent k){}
		public void keyReleased(KeyEvent k){}
		public void keyTyped(KeyEvent k)
		{
			if(!(k.getKeyChar() >= '0' && k.getKeyChar() <= '9'))
				k.consume();
		}
	}
	
	private void Ini()
	{
		CargarCombo();
		formfact.setNombcliente("");
		formfact.setApellcliente("");
		formfact.setDirecccliente("");
		formfact.setTxtRif("");
		formfact.setNombre("");
		formfact.setApellido("");
		//formfact.SetFecha(new Date());
		formfact.setIva("0.0");
		formfact.setSubTotal("0.0");
		formfact.setTotal("0.0");
		formfact.SetTxtcantidad(1);
		formfact.VaciarDatos();
		List<Object>L = new ArrayList();
		L.add("");
		L.add("");
		L.add("");
		L.add("");
		L.add("");
		formfact.Anadir(L);
		try
		{
			Conexion conexion= new Conexion();
			ResultSet registro;
			registro = conexion.consultar("SELECT COUNT(rif) as N FROM factura");
			registro.next();
			formfact.SetNumero(registro.getInt("N")+1);
		}
		catch (SQLException f)
		{
			f.printStackTrace();
		}
	}
	
	/****************************** METODOS DE BUSQUEDAS ************************************/
	public void BuscarCliente()
	{
		try
		{
			FacturaVDAO DAO = new FacturaVDAO();
			ResultSet registro = DAO.BuscarCliente(formfact.getTxtRif().getText());
			
			if(registro.next())
			{
				formfact.setNombcliente(registro.getString("nombre") );
			    formfact.setApellcliente(registro.getString("apellido") );
			    formfact.setDirecccliente(registro.getString("direccion") );
			    
			}
			else
				formfact.mostrarMensaje("El Cliente " + formfact.getTxtRif().getText() +" No esta registrado!");
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	/*private String BuscarCodigo(String str)
	{
		try
		{
			FacturaVDAO DAO = new FacturaVDAO();
			ResultSet registro = DAO.BuscarProducto(str);
			
			if(registro.next())
				return registro.getString("codproducto");
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		return "";
	}*/
	private String BuscarCodigo(String str)
	{
		try
		{
			Conexion conexion= new Conexion();
			ResultSet registro = 
				conexion.consultar("SELECT * FROM producto WHERE descripcion = '" + str + "'");
			if(registro.next())
				return registro.getString("codproducto");
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		return "";
	}
	private float BuscarPrecio(JComboBox comb)
	{
		try
		{
			Conexion conexion= new Conexion();
			ResultSet registro = 
				conexion.consultar("SELECT * FROM producto WHERE descripcion = '" + comb.getItemAt(comb.getSelectedIndex()) + "'");
			if(registro.next())
				return registro.getFloat("preciou");
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		return 0;
	}
	
	private void Actualizar(String str, Float cant){/// codigo del producto
		List<String>L = new ArrayList();
		List<String>L1 = new ArrayList();
		try
		{

			Conexion conexion= new Conexion();
			ResultSet registro = 
				conexion.consultar ("SELECT * FROM productoingrediente WHERE codproducto = '" + str + "'");
			while(registro.next()){
					    String codingrediente= registro.getString("codingrediente");
					    Float cantidad= registro.getFloat("cantidadingrediente");
					    L.add(codingrediente);
			            cantidad= cantidad*cant;
					    L1.add(cantidad.toString());
				}
				
			for(int ii=0;ii<L.size();ii++){
			Float exis;
				registro = conexion.consultar(
					"SELECT * FROM ingrediente WHERE codingrediente = '" + 
				L.get(ii) + "'");
			
	    		if(registro.next())
	    		{
	    			String codingrediente = registro.getString("codingrediente");
	    			Float existencia = registro.getFloat("existencia");
	    			exis = existencia - Float.parseFloat(L1.get(ii));
					String SQL = "UpDATE ingrediente SET  existencia = "+
				     exis + " WHERE codingrediente = '"+
				    codingrediente+"'";			
				conexion.ejecutar(SQL);
					
		     }
		}
	    		
	    		
			    }
		catch(SQLException e)
		{
			e.printStackTrace();
		}
	
	}
	/****************************** CARGAR COMBO ************************************/
	
	private void CargarCombo()
	{
		try
		{
			String Items = "";
			FacturaVDAO DAO = new FacturaVDAO();
			ResultSet registro = DAO.BuscarCategoria();
			
			while(registro.next())
				Items +=  registro.getString("descripcion") + "," ;
			formfact.SetcomboCategoria(Items);
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	private void CargarComboProd(int x)
	{
		try
		{
			String Items = "";
			FacturaVDAO DAO = new FacturaVDAO();
			ResultSet registro = DAO.BuscarProductoC(x);
			
			while(registro.next())
				Items +=  registro.getString("descripcion") + ",";

			formfact.Setcomboproducto(Items);
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	/****************************** METODO GUARDAR ************************************/
	public void GuardarFactura()
	{
		int t = formfact.N_Elementos();
		if(t != 0 && !formfact.getTxtRif().getText().equals(""))
		{
			String SQL = "INSERT INTO factura "+
			 "(nrocontrol, rif,fechaemision) "+
			 "VALUES "+"('"+ formfact.GetNumero().getText()  +
			 "','"+ formfact.getTxtRif().getText()+
			 "','" + new Date() +"')";
	
	        Conexion.ejecutar(SQL);
			Object DATOS[][] = formfact.GetDatos();
			
			for(int i = 0;i < t;i++)
			{
				SQL = "INSERT INTO ordenpedido "+
				 "(nrocontrol, codproducto,cantidad,totalp) "+
				 "VALUES "+"" +
				 "("+ Integer.parseInt(formfact.GetNumero().getText())  +
				 ",'"+ BuscarCodigo(DATOS[i][1].toString())+
				 "',"+ Integer.parseInt(DATOS[i][3].toString()) +
				 ","+ Float.parseFloat(DATOS[i][4].toString()) +")";
	
		        Conexion.ejecutar(SQL);
			}
		
			for(int i = 0;i < t;i++)
			{
			String ingrediente = (BuscarCodigo(DATOS[i][1].toString()));
		    Float cantidad =Float.parseFloat(DATOS[i][3].toString());
			Actualizar(ingrediente,cantidad);
			}
			formfact.mostrarMensaje("Factura guardada con Exito!");
			this.Ini();
		}
		else formfact.mostrarMensaje("Faltan datos por cargar!");
	}
	private boolean Verificar(List<Object>L)
	{	
		List<String>L1 = new ArrayList();
		List<String>L2 = new ArrayList();

		try{
		
	   String codpro=L.get(1).toString(); 
	   String codp=BuscarCodigo(codpro);
	   Float canti=Float.parseFloat(L.get(3).toString());
	  
	  	
	   Conexion conexion= new Conexion();
	 	
	   ResultSet registro = 
			conexion.consultar ("SELECT * FROM productoingrediente WHERE codproducto = '" + codp + "'");
		
		while(registro.next()){		    
			String codingrediente= registro.getString("codingrediente");
				    Float cantidad= registro.getFloat("cantidadingrediente");
				    L2.add(codingrediente);
		            cantidad= cantidad*canti;
				    L1.add(cantidad.toString());	
		}
		

		
	   for (int ii=0;ii<L2.size();ii++){
		    registro = conexion.consultar(
				"SELECT * FROM ingrediente WHERE codingrediente = '" + 
			L2.get(ii) + "'");
		    if(registro.next())
		    {		
				String codingrediente = registro.getString("codingrediente");	
				Float existencia = registro.getFloat("existencia");	   
			
				if (existencia < Float.parseFloat(L1.get(ii)))
				 return true;	  	
				 else 
				 return false;
			
	         	}
	       }
		}
		catch(SQLException e)
			{
				e.printStackTrace();
			}	
	     return false;   
	}

	public void actionPerformed(ActionEvent e)
    {
		if (e.getActionCommand().equals("B"))
			BuscarCliente();
		else if (e.getActionCommand().equals("Guardar"))
				GuardarFactura();
		else if (e.getActionCommand().equals("comboBoxChanged"))
			CargarComboProd(formfact.GetcomboCategoria().getSelectedIndex());
		else if (e.getActionCommand().equals("Cancelar"))
			Ini();
		else if (e.getActionCommand().equals("I"))
    	{
			if(formfact.Getcomboproducto().getSelectedIndex() == -1)
				formfact.mostrarMensaje("Seleccione un producto!");
			 else if(Integer.parseInt(formfact.GetTxtcantidad().getText())>0)
		    {
				List<Object>L = new ArrayList();
				L.add(formfact.GetcomboCategoria().getItemAt(formfact.GetcomboCategoria().getSelectedIndex()));
				L.add(formfact.Getcomboproducto().getItemAt(formfact.Getcomboproducto().getSelectedIndex()));
				L.add(BuscarPrecio(formfact.Getcomboproducto()));
				L.add(formfact.GetTxtcantidad().getText());
				L.add(Float.parseFloat(L.get(2).toString()) * Float.parseFloat(L.get(3).toString()));
				if (!Verificar(L))
                {
				formfact.Anadir(L);
				formfact.setSubTotal(""+(Float.parseFloat(L.get(4).toString())+Float.parseFloat(formfact.getSubTotal().getText())));
				formfact.setIva(""+(0.12*Float.parseFloat(formfact.getSubTotal().getText())));
				formfact.setTotal(""+(Float.parseFloat(formfact.getSubTotal().getText())+Float.parseFloat(formfact.getIva().getText())));
                }			
				else  formfact.mostrarMensaje("no hay ingrediente para este pedido!");  
		    }
			else formfact.mostrarMensaje("Ingrese una cantidad valida!");
    	
    	}
		else if (e.getActionCommand().equals("Imprimir"))
			formfact.mostrarMensaje("Lo Sentimos aun no ha sido programada esta funcion!!!");
		else if (e.getActionCommand().equals("Salir"))
			formfact.dispose();
    }
}
